#include <stdint.h>
#include <stdio.h>
#include "bmp.h"
#include "common.h"
#include "digimon_libs.h"
#include <math.h>

typedef unsigned char uchar;

/*********************************************************************
 *  名称�? get_bmp_form_flash
 *  功能�? 将flash
 *  参数�? char *bmp_data flash读取的bmp数据
 *  参数�? char (*array)[2] 二级数组指针
 *  返回值：void
 ********************************************************************/
static void get_bmp_form_flash(uint16_t id, uint8_t index, uchar *tempSaveData)
{
    uint16_t all_index = get_bmps_start_position_index(id) + index;
    FILE *fp = NULL;
    fp = fopen("./digimon_lib.bin", "rb");
    if(fp)
    {
        fseek(fp, all_index*BMP_16_16_SIZE, SEEK_SET);
        fread(tempSaveData, 1, BMP_16_16_SIZE, fp);
        fclose(fp);
    }
}

/*********************************************************************
 *  名称�? bmp_data_to_array
 *  功能�? 将flash中读取的bmp数据填充�?16×2的二级数组中
 *  参数�? char *bmp_data flash读取的bmp数据
 *  参数�? char (*array)[2] 二级数组指针
 *  返回值：void
 ********************************************************************/
static void bmp_data_to_array(uchar *bmp_data, uchar (*array)[2])
{
    uchar *pos;
    uint8_t w = 16;
    uint8_t h = 16;
    uint8_t len;
    len = ((31 + w) / 32) * 4;
    int i, j;

    for (i = 0; i < h; i++)
    {
        pos = bmp_data + BMP_16_16_SIZE - (len * (i + 1));
        for (j = 0; j < w; j += 8)
        {
            array[i][j / 8] = ~(pos[j / 8]);
        }
    }
}


/*********************************************************************
 *  名称�? bmp_f16_t16
 *  功能�? �?16*2的bmpchange�?48×48
 *  参数�? char *bmp_data flash读取的bmp数据
 *  参数�? char (*array)[16] 二级数组指针
 *  返回值：void
 ********************************************************************/
void bmp_f16_t16(uchar (*in_array)[2], uchar (*out_array)[16])
{
    int i = 0, j = 0, k = 0;
    /* 1.先把16×2 展开�?2进制�?16×16 */
    for (i = 0; i < 16; i++)
    {
        for (j = 0; j < 2; j++)
        {
            for (k = 0; k < 8; k++)
            {
                out_array[j * 8 + k][i] = 0x01 & (in_array[i][j] >> (7 - k));
            }
        }
    }
    //dump_array(out_array, 16);
}


/*********************************************************************
 *  名称： bmp_f16_t2
 *  功能： 将48*48的二进制转成16进制
 *  参数： char *bmp_data flash读取的bmp数据
 *  参数： char (*array)[16] 二级数组指针
 *  返回值：void
 ********************************************************************/
void bmp_f16_t2(char (*in_array)[16], uchar (*arr16_2)[2])
{
    int nuu = 0;
    int i = 0, j = 0;
    for (i = 0; i < 16; i++)
    {
        for (j = 0; j < 16; j++)
        {
            nuu += in_array[i][j] * pow(2, (7 - j % 8));
            if (((j + 1) % 8 == 0) && j > 0)
            {
                arr16_2[i][j / 8] = nuu;
                nuu = 0;
            }
        }
    }
}


int init_bmp(uint16_t id, uint8_t index, uchar (*bmps)[DIGIMON_W][DIGIMON_H])
{
    uchar tempSaveData[BMP_16_16_SIZE] = {0};
    //uchar arr16_2[16][2] = {0};
    uchar arr16_16[16][16] = {0};

    //1. get bmp form flash
    get_bmp_form_flash(id, index, tempSaveData);

    //2. bmp data to array
    bmp_data_to_array(tempSaveData, bmps[index]);

    //3. 16_16 to 48_48
    bmp_f16_t16(bmps[index], arr16_16);

    //16 to 2
    bmp_f16_t2(arr16_16, bmps[index]);

    //dump_array(arr16_16,16);
    return 0;
}

int init_digimon_bmps(uint16_t id, uint8_t bmp_num, uchar (*bmps)[DIGIMON_W][DIGIMON_H])
{
    int index = 0;
    for (index = 0; index < bmp_num; index++)
    {
        init_bmp(id, index, bmps);
    }
    return 0;
}




